package dtofactory;
import java.util.ArrayList;
import java.util.Vector;

import entities.*;
import entitiesdto.*;


public class FactoryDTO {

	private static FactoryDTO instance;

	private FactoryDTO(){

	}

	public static FactoryDTO getInstance(){
		if(instance==null)
			instance = new FactoryDTO();
		return instance;
	}

	// Articulo

	public ArticuloDTO artToDto(Articulo articulo){
		ArticuloDTO dto = null;
		if (articulo instanceof Hogar){
			Hogar art = (Hogar) articulo;
			HogarDTO aux = new HogarDTO();
			aux.setColor(art.getColor());
			aux.setDescripcion(art.getDescripcion());
			aux.setLinea(art.getLinea());
			aux.setPrecio(art.getPrecio());
			aux.setRef(art.getRef());
			aux.setSeccion(art.getSeccion());
			aux.setTiempoFabricacion(art.getTiempoFabricacion());
			//especificos
			aux.setNombre(art.getNombre());
			aux.setCategoria(art.getCategoria());
			aux.setMedidas(art.getMedidas());
			aux.setComposicion(art.getComposicion());

			ArrayList<CantidadMateriaPrimaDTO> result = new ArrayList<CantidadMateriaPrimaDTO>();
			for(CantidadMateriaPrima c : art.getCantidadMateriasPrimas()){
				CantidadMateriaPrimaDTO cmp = cmpToDto(c);
				result.add(cmp);
			}
			aux.setCantidadMateriasPrimas(result);
			dto = aux;
			
		} else if (articulo instanceof Ropa){
			Ropa art = (Ropa) articulo;
			RopaDTO aux = new RopaDTO();
			aux.setColor(art.getColor());
			aux.setDescripcion(art.getDescripcion());
			aux.setLinea(art.getLinea());
			aux.setPrecio(art.getPrecio());
			aux.setRef(art.getRef());
			aux.setSeccion(art.getSeccion());
			aux.setTiempoFabricacion(art.getTiempoFabricacion());
			//especificos
			aux.setTalle(art.getTalle());
			aux.setOrigen(art.getOrigen());

			ArrayList<CantidadMateriaPrimaDTO> result = new ArrayList<CantidadMateriaPrimaDTO>();
			for(CantidadMateriaPrima c : art.getCantidadMateriasPrimas()){
				CantidadMateriaPrimaDTO cmp = cmpToDto(c);
				result.add(cmp);
			}
			aux.setCantidadMateriasPrimas(result);
			dto = aux;
		}

		return dto;
	}

	public Articulo dtoToArt(ArticuloDTO articulo){
		Articulo respuesta = null;
		if (articulo instanceof HogarDTO){
			HogarDTO art = (HogarDTO) articulo;
			Hogar aux = new Hogar();
			aux.setColor(art.getColor());
			aux.setDescripcion(art.getDescripcion());
			aux.setLinea(art.getLinea());
			aux.setPrecio(art.getPrecio());
			aux.setRef(art.getRef());
			aux.setSeccion(art.getSeccion());
			aux.setTiempoFabricacion(art.getTiempoFabricacion());
			//especificos
			aux.setNombre(art.getNombre());
			aux.setCategoria(art.getCategoria());
			aux.setMedidas(art.getMedidas());
			aux.setComposicion(art.getComposicion());

			ArrayList<CantidadMateriaPrima> result = new ArrayList<CantidadMateriaPrima>();
			for(CantidadMateriaPrimaDTO c : art.getCantidadMateriasPrimas()){
				CantidadMateriaPrima cmp = dtoToCmp(c);
				result.add(cmp);
			}
			aux.setCantidadMateriasPrimas(result);
			respuesta = aux;
			
		} else if (articulo instanceof RopaDTO){
			RopaDTO art = (RopaDTO) articulo;
			Ropa aux = new Ropa();
			aux.setColor(art.getColor());
			aux.setDescripcion(art.getDescripcion());
			aux.setLinea(art.getLinea());
			aux.setPrecio(art.getPrecio());
			aux.setRef(art.getRef());
			aux.setSeccion(art.getSeccion());
			aux.setTiempoFabricacion(art.getTiempoFabricacion());
			//especificos
			aux.setTalle(art.getTalle());
			aux.setOrigen(art.getOrigen());

			ArrayList<CantidadMateriaPrima> result = new ArrayList<CantidadMateriaPrima>();
			for(CantidadMateriaPrimaDTO c : art.getCantidadMateriasPrimas()){
				CantidadMateriaPrima cmp = dtoToCmp(c);
				result.add(cmp);
			}
			aux.setCantidadMateriasPrimas(result);
			respuesta = aux;
		}

		return respuesta;
	}

	// Cantidad Materia Prima

	public CantidadMateriaPrima dtoToCmp(CantidadMateriaPrimaDTO c){
		CantidadMateriaPrima aux = new CantidadMateriaPrima();
		aux.setCantidad(c.getCantidad());
		aux.setMateriaPrima(this.mpFromDTO(c.getMateriaPrima()));
		return aux;
	}

	public StockMateriaPrima dtoToSMP(StockMateriaPrimaDTO c){
		StockMateriaPrima aux = new StockMateriaPrima();
		aux.setCantidad(c.getCantidad());
		aux.setMateriaPrima(this.mpFromDTO(c.getMateriaPrima()));
		return aux;
	}

	
	public MateriaPrima mpFromDTO(MateriaPrimaDTO mp){
		MateriaPrima materia = new MateriaPrima();
		materia.setDescripcion(mp.getDescripcion());
		materia.setRef(mp.getRef());
		materia.setUnidadMedida(mp.getUnidadMedida());
		return materia;
	}
	public CantidadMateriaPrimaDTO cmpToDto(CantidadMateriaPrima cmp){
		CantidadMateriaPrimaDTO aux = new CantidadMateriaPrimaDTO();
		aux.setCantidad(cmp.getCantidad());
		aux.setMateriaPrima(mpToDto(cmp.getMateriaPrima()));
		return aux;
	}

	//Materia Prima
	
	public MateriaPrimaDTO mpToDto(MateriaPrima mp){
		MateriaPrimaDTO aux = new MateriaPrimaDTO();
		aux.setRef(mp.getRef());
		aux.setDescripcion(mp.getDescripcion());
		aux.setUnidadMedida(mp.getUnidadMedida());
		return aux;

	}

	//Cantidad Articulo
	public CantidadArticuloDTO asolToDTO(CantidadArticulo as){
		CantidadArticuloDTO a = new CantidadArticuloDTO();
		a.setCantidadPedida(as.getCantidadPedida());
		a.setId(as.getId());
		a.setArticulo(this.artToDto(as.getArticulo()));
		return a;

	}
	
	public CantidadArticulo asolFromDTO(CantidadArticuloDTO ca){
		CantidadArticulo a = new CantidadArticulo();
		a.setCantidadPedida(ca.getCantidadPedida());
		a.setId(ca.getId());
		a.setArticulo(this.dtoToArt(ca.getArticulo()));
		return a;
	}
	
	public CentroDeDistribucion cdFromDTO(CentroDeDistribucionDTO c){
		CentroDeDistribucion centro = new CentroDeDistribucion();
		centro.setId(c.getId());
		centro.setName(String.valueOf(c.getId()));
		return centro;
	}
	
	
	public SolicitudFabricacion solFromDTO(SolicitudFabricacionDTO sol){
		SolicitudFabricacion toreturn = new SolicitudFabricacion();
		Vector artics = new Vector<CantidadArticulo>();
		for(CantidadArticuloDTO c: sol.getArticulos()){
			CantidadArticulo cart = this.asolFromDTO(c);
			artics.add(cart);
		}
		toreturn.setArticulos(artics);
		toreturn.setId(sol.getId());
		toreturn.setReferenciaCD(this.cdFromDTO(sol.getReferenciaCD()));
		return toreturn;
	}
	

}
